/*--------------------------------------------------------------------
模块名称: 双向全双工UART驱动模块
模块作者：陈首敏
编制时间: 2021-12-30
功能描述: 收发同时进行,发送buf一边发一边清零,接收多少个清除多少个
版本号: 		 V2.0
---------------------------------------------------------------------*/

#define UART_DRV_C

#include 	"Global.h"


static unsigned short RecTimeOut = 0;
static unsigned short SendLength = 0;
static unsigned short TxdNum = TXD_BUF_LENGTH;
static unsigned short RecNum = RXD_BUF_LENGTH;
static unsigned char UartRXDBuf[RXD_BUF_LENGTH] = {0};
static unsigned char UartTXDBuf[TXD_BUF_LENGTH]= {0};
static unsigned char TxdBusyTim = 0;
static unsigned char SendLock = 0;

void RXDInit(void);

/**************************************************************
//Fuction Name: void UartRegistInit(void)
//Desrition: 串口通信寄存器初始化
//Input: 		
//Output: 
//Author:陈首敏
//Date:2021.12.1
***************************************************************/
static void UartRegistInit(void)
{

}

/**************************************************************
//Fuction Name: void IRQ_REC(uchar temp)
//Desrition: 接收中断函数
//Input: 中断接收到数据		
//Output: 
//Author:陈首敏
//Date:2021.12.1
***************************************************************/
void IRQ_REC(unsigned char temp)
{
	if((RecTimeOut)&&(0 == SendLock))
	{
		if(RecNum < RXD_BUF_LENGTH)
		{
			RecTimeOut = UART_DECODE_DELAY_TIME;
			UartRXDBuf[RecNum ] = temp;
			RecNum ++;
#if(DUPLEX_MODE == HALF_DUPLEX)					
			TxdBusyTim = UART_DECODE_DELAY_TIME + 1;
#endif
		}
	}	
}

/**************************************************************
//Fuction Name: IRQ_TXD(void)
//Desrition: 发送中断函数
//Input: 		
//Output: 
//Author:陈首敏
//Date:2021.12.1
***************************************************************/
void IRQ_TXD(void)
{
	if(TxdNum < SendLength )
	{
		UART_SendByte(UartTXDBuf[TxdNum ]);
		UartTXDBuf[TxdNum ] = 0;
		TxdNum ++;
		TxdBusyTim = UART_SEND_DELAY_TIME;
	}
	else
	{
		DIS_TXD_INT();
#if(DUPLEX_MODE == HALF_DUPLEX)		
		RXDInit();
#endif
	}
}

/**************************************************************
//Fuction Name: void RXDInit(void)
//Desrition: 接收初始化
//Input: 		
//Output: 
//Author:陈首敏
//Date:2021.12.1
***************************************************************/
static void RXDInit(void)
{
	while(RecNum)
	{
		RecNum --;
		UartRXDBuf[RecNum] = 0;
	}
	RecNum = 0; 
	RecTimeOut = 60000;
	SendLock = 0;
	EN_RXD_INT();
}

/**************************************************************
//Fuction Name: void InitUartSend(void)
//Desrition: 发送初始化
//Input: 		
//Output: 
//Author:Chen Shou Min
//Date:2021.12.1
***************************************************************/
static void InitUartSend(void)
{
#if(DUPLEX_MODE == HALF_DUPLEX)	
	DIS_RXD_INT();
	SendLock = 1;
#endif
	TxdNum = 1;
	EN_TXD_INT();
	UART_SendByte(UartTXDBuf[0]);
}

/**************************************************************
//Fuction Name: void UartRxdProc(void)
//Desrition: 串口通信接收函数
//Input: 		
//Output: 
//Author:Chen Shou Min
//Date:2021.12.1
***************************************************************/
static void UartRxdProc(pDecodeFunc pRecFunc)
{
	if(GetTimeTick(TIME_10ms))
	{
		if(RecTimeOut)
		{
			RecTimeOut --;
			if(RecTimeOut == 0)
			{
				if(RecNum)
				{
					(*pRecFunc)(UartRXDBuf,RecNum);
				}
				RXDInit();
			}
		}
	}
}

/**************************************************************
//Fuction Name: void UartTxdProc(void)
//Desrition: 串口通信发送函数
//Input: 		
//Output: 
//Author:Chen Shou Min
//Date:2021.12.1
***************************************************************/
static void UartTxdProc(pEncodeFunc pSendFunc)
{
	if(TxdBusyTim == 0)
	{
		SendLength = (*pSendFunc)(UartTXDBuf);
		if(SendLength)
		{
			TxdBusyTim = UART_SEND_DELAY_TIME;
			InitUartSend();
		}
	}
	else
	{
		if(GetTimeTick(TIME_10ms))TxdBusyTim --;
	}
}

/**************************************************************
//Fuction Name: void UartDrvProc(void)
//Desrition: 串口通信主函数
//Input: 		
//Output: 
//Author:Chen Shou Min
//Date:2021.12.1
***************************************************************/
void UartDrvProc(pDecodeFunc pRecFunc,pEncodeFunc pSendFunc)
{
	UartRxdProc(pRecFunc);
	UartTxdProc(pSendFunc);
}

/**************************************************************
//Fuction Name: void UartDrvInit(void)
//Desrition: 串口通信初始化
//Input: 		
//Output: 
//Author:Chen Shou Min
//Date:2021.12.1
***************************************************************/
void UartDrvInit(void)
{ 
	while(TxdNum )
	{
		TxdNum --;
		UartTXDBuf[TxdNum ] = 0;
	}
	RXDInit();
	UartRegistInit();
}
